/** ***********************************************************************************
* @file         net_socket_api.h
* @brief        网络数据处理API接口 头文件
* @details      主要用来主力网络链接、发送、接收关闭多链接异步通信机制
* @author       杨小珛
* @date         2020/12/23
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef NET_SOCKET_API_H
#define NET_SOCKET_API_H
/* Standard includes. */
#include "os_app.h"
#include "net_task.h"

/****************** IP或者域名连接 回应 ******************************/
#define CONNECT_OK               0x00000000 // 连接成功
#define CONNECT_ERR              0x00000001 // 命令错误
#define CONNECT_TIMEOUT          0x00000002 // 命令超时
#define CONNECT_PRA_ERR          0x00000003 // 参数错误
#define CONNECT_NOINIT           0x00000004 // 未初完成始化配置
#define CONNECT_CONFIG_ERR       0x00000005 // 连接配置错误 配置为IP或者域名
#define CONNECT_PHONE_IN         0x00000006 // 正在通话中
#define CONNECT_ALLOC_INDEX_ERR  0x00000007 // 分配INDEX错误
#define CONNECT_PRTC_TYPE_ERR    0x00000008 // 协议类型错误
#define CONNECT_INDEX_USING      0x00000009 // INDEX占用错误

#define CONNECT_TYPE_IP          0x00000000 //IP地址连接
#define CONNECT_TYPE_DOMAIN      0x00000001 //域名连接

/** ****************************************************************************
* @remarks       uint32_t connect_type_check(uint8_t *pAddr)
* @brief         服务器地址类型判断
* @param[in]     *pAddr 服务器地址
* @param[out]    无
* @return        CONNECT_TYPE_DOMAIN CONNECT_TYPE_IP
* @attention     无
*******************************************************************************/
extern uint32_t connect_type_check(uint8_t *pAddr);

/** ****************************************************************************
* @remarks       void socket_default( socket_handle_s *pxSocketHandle )
* @brief         初始化socket 连接参数
* @param[in]     *pxSocketHandle 服务器链接参数
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void socket_default( socket_handle_s *pxSocketHandle );

/** ****************************************************************************
* @remarks       uint32_t  socket_bind( socket_handle_s *pxSocketHandle, char *Ip, uint16_t Port, protocol_type_e ePtclType, socket_state_fun_t FDiscCallback )
* @brief         初始化socket 连接参数
* @param[in]     char *Ip                        : IP/域名地址
* @param[in]     Port                   : 端口号
* @param[in]     ePtclType       : 连接类型  e_socket_protocol_tcp, e_socket_protocol_udp e_socket_protocol_mqtt
*		        socket_state_fun_t FDiscCallback  : 链接断开时的回调函数
* @param[in]     FDiscCallback  : 链接断开时的回调函数
* @param[out]    *pxSocketHandle : SOCKET句柄
* @return        pdFAIL :失败 pdPASS 成功
* @attention     可重入，已连接的SOCKET会先断开
*******************************************************************************/
extern uint32_t  socket_bind( socket_handle_s *pxSocketHandle, char *Ip, uint16_t Port, protocol_type_e ePtclType, socket_state_fun_t FDiscCallback );

/** ****************************************************************************
* @remarks       uint32_t  socket_close( socket_handle_s *pxSocketHandle )
* @brief         SOCKET关闭
* @param[in]     *pxSocketHandle : SOCKET句柄
* @param[out]    无
* @return        pdFAIL :失败 pdPASS 成功
* @attention     可重入
*******************************************************************************/
extern uint32_t  socket_close( socket_handle_s *pxSocketHandle );

/** ****************************************************************************
* @remarks       uint32_t  socket_connect( socket_handle_s *pxSocketHandle )
* @brief         SOCKET连接
* @param[in]     *pxSocketHandle : SOCKET句柄
* @param[out]    无
* @return        CONNECT_NOINIT CONNECT_OK CONNECT_ERR CONNECT_CONFIG_ERR CONNECT_TIMEOUT
* @attention     半可重入，内部互斥，有阻塞
*******************************************************************************/
extern uint32_t  socket_connect( socket_handle_s *pxSocketHandle );

/** ****************************************************************************
* @remarks       uint32_t  socket_write( socket_handle_s *pxSocketHandle, uint8_t *pData, uint32_t Dlen )
* @brief         SOCKET数据发送
* @param[in]     *pxSocketHandle : SOCKET句柄
* @param[in]     *pData : 数据地址
* @param[in]     Dlen : 数据长度
* @param[out]    无
* @return        pdFAIL :失败 pdPASS 成功
* @attention     可重入，异步模式，无阻塞，队列满时10ms延时等待，返回成功只表示底层
*                接收成功，不意味对方IP已经收到，失败时表示塞队列超时
*******************************************************************************/
extern uint32_t  socket_write( socket_handle_s *pxSocketHandle, uint8_t *pData, uint32_t Dlen );

/** ****************************************************************************
* @remarks       uint32_t socket_recv(
*                         socket_handle_s  *pxSocketHandle,
*                         uint8_t *pData,
*                         uint32_t DelayMs )
* @brief         SOCKET数据接收
* @param[in]     *pxSocketHandle : SOCKET句柄
* @param[in]     *pData : 数据地址
* @param[in]     DelayMs : 延时时间
* @param[out]    无
* @return        接收数据的长度
* @attention     可重入,支持异步建立连接、收取数据
*******************************************************************************/
extern uint32_t  socket_recv(
                        socket_handle_s  *pxSocketHandle,
                        uint8_t *pData,
                        uint32_t DelayMs );

/** ****************************************************************************
* @remarks       uint32_t  socket_free_connect( char *ip, uint16_t port ,uint8_t type )
* @brief         SOCKET快速连接
* @param[in]     *ip : 服务器IP地址
* @param[in]     port : 服务器端口号
* @param[in]     type : 连接方式
* @param[out]    *socketid 连接的socket id
* @return        CONNECT_NOINIT CONNECT_OK CONNECT_ERR CONNECT_CONFIG_ERR CONNECT_TIMEOUT
* @attention     半可重入，内部互斥，有阻塞
*******************************************************************************/
extern uint32_t  socket_free_connect( char *ip, uint16_t port ,uint8_t type , uint32_t *socketid );

/** ****************************************************************************
* @remarks       uint32_t  socket_free_write( uint16_t sock_id ,uint8_t * data , uint16_t len )
* @brief         sock_id  
* @param[in]     *pxSocketHandle : SOCKET句柄
* @param[in]     *pData : 数据地址
* @param[in]     Dlen : 数据长度
* @param[out]    无
* @return        pdFAIL :失败 pdPASS 成功
* @attention     
*******************************************************************************/
extern uint32_t  socket_free_write( uint16_t sock_id ,uint8_t * data , uint16_t len );

/** ****************************************************************************
* @remarks       int32_t  socket_free_recv( uint16_t sock_id ,uint8_t * data , uint16_t len )
* @brief         接收 TCP 数据函数，一次读取最长不超过 2048 字节。
* @param[in]     sock 创建的sock id  
* @param[in]     len 接收数据 data 首地址 
* @param[out]    *data 数据首地址
* @return        ≥0 - 实际接收到的数据长度(对端正常断开为 0) ＜0 - socket 错误（网络异常断开-1）
* @attention     无
*******************************************************************************/
extern int32_t  socket_free_recv( uint16_t sock_id ,uint8_t * data , uint16_t len );

/** ****************************************************************************
* @remarks       uint32_t net_close(uint16_t index ,uint8_t type)
* @brief         关闭NET 网络链接
* @param[in]     sock_id 网络节点
* @param[in]     type 网络连接模式
* @param[out]    无
* @return        pdFAIL 发送失败 pdPASS 发送成功
* @attention     无
*******************************************************************************/
extern uint32_t  socket_free_close( uint16_t sock_id , uint8_t type );

#endif

